package com.swgk.core.util;

import android.util.Log;

import com.swgk.core.BuildConfig;

import java.util.Formatter;

public final class LogUtil {
    private static final int V = Log.VERBOSE;
    private static final int D = Log.DEBUG;
    private static final int I = Log.INFO;
    private static final int W = Log.WARN;
    private static final int E = Log.ERROR;
    private static final int A = Log.ASSERT;

    private static String sTag = "LogUtils";
    private static boolean sDebug = BuildConfig.DEBUG;

    public static void init(boolean debug, String tag) {
        sDebug = debug;
        sTag = tag;
    }



    private LogUtil() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }

    public static void v(String msg) {
        log(V, sTag, msg);
    }

    public static void v(String tag, String msg) {
        log(V, tag, msg);
    }

    public static void d(String msg) {
        log(D, sTag, msg);
    }

    public static void d(String tag, String msg) {
        log(D, tag, msg);
    }

    public static void i(String msg) {
        log(I, sTag, msg);
    }

    public static void i(String tag, String msg) {
        log(I, tag, msg);
    }

    public static void w(String msg) {
        log(W, sTag, msg);
    }

    public static void w(String tag, String msg) {
        log(W, tag, msg);
    }

    public static void e(String msg) {
        log(E, sTag, msg);
    }

    public static void e(String tag, String msg) {
        log(E, tag, msg);
    }

    public static void a(String msg) {
        log(A, sTag, msg);
    }

    public static void a(String tag, String msg) {
        log(A, tag, msg);
    }


    private static void log(final int type, String tag, String msg) {
        if (!sDebug) {
            return;
        }
        if (tag == null || tag.length() == 0
                || msg == null || msg.length() == 0) {
            return;
        }

        int segmentSize = 3 * 1024;
        long length = msg.length();
        if (length <= segmentSize) {// 长度小于等于限制直接打印
            Log.println(type, tag, msg + processTagAndHead());
        } else {
            Log.println(type, tag, "╔════════════════════════════════════════════════════════════════════════════════════════start═══════════════════════════════════════════════════════════════════════════════════════");
            Log.println(type, tag, "║ ");
            while (msg.length() > segmentSize) {// 循环分段打印日志
                String logContent = msg.substring(0, segmentSize);
                msg = msg.replace(logContent, "");
                Log.println(type, tag, "║ " + logContent);
            }
            // 打印剩余日志
            Log.println(type, tag, "║ " + msg);
            Log.println(type, tag, "║ ");
            Log.println(type, tag, "║ " + processTagAndHead());
            Log.println(type, tag, "╚════════════════════════════════════════════════════════════════════════════════════════end═══════════════════════════════════════════════════════════════════════════════════════");
        }

    }

    private static String processTagAndHead() {
        StackTraceElement targetElement = null;

        final StackTraceElement[] elements = Thread.currentThread().getStackTrace();
        for (int i = elements.length - 2; i >= 0; i--) {
            StackTraceElement caller = elements[i];
            if (LogUtil.class.getName().equals(caller.getClassName())) {
                targetElement = elements[i + 1];
                break;
            }
        }
        if (targetElement == null) {
            return null;
        } else {
            String head = new Formatter()
                    .format("\t\t------> | %s(%s:%d) | Thread -> %s",
                            targetElement.getMethodName(),
                            targetElement.getFileName(),
                            targetElement.getLineNumber(),
                            Thread.currentThread().getName())
                    .toString();
            return head;
        }
    }
}